﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MySingleton
{
    /// <summary>
    /// Шаблон Singleton применяют в случаях, когда необходимо
    /// создание только одного экземпляра некоторого класса. 
    /// То-есть, когда в программе произойдет попытка создания ещё
    /// одного объекта некоего класса, то будет возвращён тот самый объект
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            MySingletonClass instance1 = MySingletonClass.GetMy_instance();
            instance1.Flag = true;
            Console.WriteLine("instance1.Flag  = " + instance1.Flag);
            Console.ReadKey();
            MySingletonClass instance2 = MySingletonClass.GetMy_instance();
            instance2.Flag = false;
            Console.WriteLine("instance2.Flag  = " + instance2.Flag);
            Console.ReadKey();
            Console.WriteLine("В итоге поле instance1.Flag изменилось и теперь = " + instance1.Flag + "\n - один объект, две ссылки");
            Console.ReadKey();
        }
    }
    /// <summary>
    /// Конструктор класса помечен модификатором видимости
    /// private. Это не позволит создать экземпляр класса
    /// напрямую (используя оператор new). 
    /// Но возможно создать экземпляр внутри класса MySingletonClass т. к. 
    /// конструктор закрытый на уровне объекта, но внутри самого
    /// класса он видим в любом случае, а значит, работает внутри класса.
    /// </summary>
    sealed class MySingletonClass
    {
        private static MySingletonClass my_instance = new MySingletonClass();
        private MySingletonClass() { }
        /// <summary>
        /// Метод GetMy_instance() всегда возвращает один единственный
        /// экземпляр класса MySingletonClass. В многопоточных
        /// программах при одновременном вызове метода GetMy_instance()
        /// из нескольких потоков можно создать несколько экземпляров класса MySingletonClass
        /// А должен остаться только один! Данная конструкция и не позволяет создавать
        /// экземпляры данного класса даже из других потоков.
        /// </summary>
        /// <returns></returns>
        public static MySingletonClass GetMy_instance()
        {
            return my_instance;
        }
        private bool m_flag;

        public bool Flag
        {
            get { return m_flag; }
            set { m_flag = value; }
        }

    }
}
